from flask import Flask, current_app
from common.response_handler import response_error


class HttpError(Exception):
    """request请求异常"""
    def __init__(self, e):
        current_app.logger.warning({f"HttpError: {e}"})


class SqlError(Exception):
    """sql执行异常"""
    def __init__(self, e):
        current_app.logger.warning(f"SqlError: {e}")


class RequiredParamError(Exception):
    """请求参数缺失异常"""
    def __init__(self, e):
        current_app.logger.warning(f"RequiredParamError: {e}")


class ParamConvertIntError(Exception):
    """请求参数转换数字类型异常"""
    def __init__(self, e):
        current_app.logger.warning(f"ConvertIntError: {e}")


def init_error_handler(app: Flask):
    # 已知异常处理
    app.register_error_handler(400, lambda e: response_error("请求语法错误"))  # 如json传参用单引号
    app.register_error_handler(404, lambda e: response_error("sorry, page does not exist"))
    app.register_error_handler(415, lambda e: response_error("请求体格式或Content-Type有误"))
    app.register_error_handler(SqlError, lambda e: response_error(f"sql执行失败: {e}"))
    app.register_error_handler(HttpError, lambda e: response_error(f"内部http请求失败: {e}"))
    app.register_error_handler(RequiredParamError, lambda e: response_error(f"必填参数缺失: {e}"))
    app.register_error_handler(ParamConvertIntError, lambda e: response_error(f"请求参数类型有误: {e}"))
    # 未知异常处理
    app.register_error_handler(500, lambda e: response_error("服务内部错误!"))
    app.logger.info("初始化异常处理完成")
